package com.flying.inter;


/**
 * @ClassName:
 * @author: flying
 * @date 2024 2024/12/13 8:43
 * @Description: 接口的使用
 * <p>
 * 使用关键字 interface 来声明一个接口，接口里可以定义以下成员
 * 1. 接口里只能定义静态常量， ，默认被  public static final 修饰
 * 2. 定义抽象方法，  public abstract 可以省略
 * 3. 使用 default 关键字，定义默认方法， JDK8以后开始
 * 4。 还可以定义静态方法
 * 5. 还可以定义私有方法
 * 6. 接口不能直接创建实例对象，除非在创建实例对象是，实现所有的抽象方法
 * 7. 接口与接口之间可以继承，而且可以多继承
 * 8. 接口中定义的静态方法，只能接口调用
 */
public class InterfaceDemo {
    public static void main(String[] args) {


        System.out.println(Math.floor(Math.PI*34*34.6));


        SubClass subClass = new SubClass();

        // 1. 接口中的静态方法只能通过接口调用
        AInterface.testStatic();


        // 2. 通过实现类的对象可以调用接口中的默认方法
        // 如果实现类重写了接口中的默认方法，调用时，仍然调用的是重写的方法
        subClass.testDefault();


        // 3. 如果子类（实现类）继承的父类和实现的接口中声明了同名同参数的方法
        // 那么子类在没有重写此方法，默认调用的是父类中同名同参数的方法--》类优先原则
        subClass.method2();


        // 4. 如果实现类实现了多个接口，而且这些接口中定义了同名同参数的默认方法
        // 那么实现类没有重写此方法的情况下，报错  ---> 接口冲突


    }
}


class SubClass extends Father implements AInterface, BInterface {


    @Override
    public void foo() {

    }

    @Override
    public void testDefault() {

        //  AInterface : 指明是哪个接口的默认方法
        // super： 通过super调用
        AInterface.super.testDefault();
    }

}


class Father {
    public void method2() {
        System.out.println("我是父类的method方法");
    }
}